# -*- coding: utf-8 -*-
import string


def str_bytes():
    """
    字符串与字节数组
    8bit = 1byte = ASCII

    """
    # 字符串类型：不可变
    s: str = '0123456789'
    print('s =', s)
    print('list(s) =', list(s))

    # 不可变字节数组bytes
    b: bytes = b'0123456789'
    print('b =', b)
    print('list(b) =', list(b))

    # 字符串与字节数组转化，指定编码格式
    charset = 'utf-8'
    print('s.encode = ', s.encode(encoding=charset))
    print('b.decode = ', b.decode(encoding=charset))

    # 可变字节数组
    ba: bytearray = bytearray(b)

    # 内存视图：不会生成新的对象，不会触发内存复制
    ma: memoryview = memoryview(b)
    print(ma.tolist())
    pass


def str_index():
    """'
    字符串下标索引
    """
    s = '0123456789'

    # 下标
    # str[index]
    print(s[0])
    print(s[9])
    """
    下标
    正数正序从0开始
    负数逆序从-1开始
    """
    print(s[-1])

    # 切片（包头不包尾）
    # str[start:stop]
    print(s[1:9])
    # 空缺值默认值是极端边界值
    print(s[:5])
    print(s[4:])

    # str[start:stop:step]
    """
    步长
    默认值空缺值=1
    正数正序
    负数逆序
    """
    print(s[1:9:2])
    print(s[::-2])

    pass


def str_type():
    # 字符串
    s = 'enter\n'
    print(s)

    # 原始字符串：去掉转义字符
    r = r'enter\n'
    print(r)

    # 字符串以unicode格式进行编码
    u = u'中文'
    print(u)

    # 字符串格式化(python=3.6.2+)
    f = f's={s},r={r},u={u}.'
    print(f)

    # 字节数组
    b = b'0123456789'
    print(b)

    pass


def str_join():
    """字符串连接"""
    str1 = 'str0' + 'str1'
    print(str1)

    strs = ['str0', 'str1', 'str2', 'str3', 'str4']
    str2 = '_'.join(strs)

    str3 = 'str1:{}, str2:{}.'.format(str1, str2)
    str4 = 'str0:{0}, str1:{0}, str2:{1}.'.format(str1, str2)
    str5 = 'str1:{a}, str2:{b}.'.format(a=str1, b=str2)
    str_list = ['str0', 'str1']
    str6 = 'str_list:{name_list[0]},{name_list[1]},'.format(name_list=str_list)

    str7 = 'str1:%s, str2:%s.' % (str1, str2)
    print(str7)

    int1 = 12
    float1 = 12.345
    # :>Nd  表示左边填充空格保证N位
    # :0>Nd  表示左边填充0保证N位
    # :0.Nf 表示四舍五入保留N位小数
    str8 = f'int1={int1:>3d}, float1={float1:0.2f}'
    # 默认调用对象的__format__()方法，如果需要表达str(obj)或repr(obj)，可以使用obj!s或obj!r表示
    obj = ''
    # str8 = f'format={obj}, str(obj)={obj!s}, repr(obj)={obj!r}'
    print(str8)

    str9 = (
        'str0'
        'str1'
        'str2'
    )
    print(str9)

    pass


def str_function():
    """
    注意函数参数不添加参数名
    :return:
    """
    s: str = 'hello world hello linux hello mysql hello redis'
    print('len(s) =', len(s))  # 返回字符串长度

    if 'linux' in s:
        print('linux in string')

    # 可以设置开始位置和结束位置
    # find找不到，返回-1
    find = s.find('hello', 10, 20)
    rfind = s.rfind('hello')

    # index找不到，报错:ValueError
    index = s.index('hello', 10, 20)
    rindex = s.rindex('hello')

    count = s.count('hello')  # 统计出现次数
    # 重新编码
    replace = s.replace('world', 'hello')  # 返回替换后的字符串，原字符串不改变
    # 可以设置替换次数
    split = s.split(' ')  # 按空格将字符串分割为单词列表
    # 可以设置分割次数

    print('s.startswith =', s.startswith('hello'))  # 是否以什么开始
    print('s.endswith =', s.endswith('hello'))  # 是否以什么结尾

    print('s.isalnum =', s.isalnum())  # 字符串中所有字符都是字母或数字（不能含有空格）
    print('s.isalpha =', s.isalpha())  # 字符串中所有字符都是字母（不能含有空格）

    capitalize = s.capitalize()  # 首字母大写
    upper = s.upper()  # 转化为大写
    lower = s.lower()  # 转化为小写

    strip = s.strip()  # 返回去除两侧（不包含内部）空格的字符串
    # s.lstrip()  # 去除左侧空格
    # s.rsplit()  # 去除右侧空格

    # 分区，返回元组
    partition = s.partition('hello')
    pass


def string_type():
    print(string.ascii_lowercase)
    print(string.ascii_uppercase)
    print(string.ascii_letters)

    print(string.digits)
    print(string.hexdigits)
    print(string.octdigits)

    # 可显示字符串
    print(string.printable)
    # 标点符号
    print(string.punctuation)

    pass


if __name__ == '__main__':
    # str_index()

    # str_type()

    # str_join()

    str_function()

    # string_type()

    pass
